home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 2000 April: Mac OS SDK / Dev.CD Apr 00 SDK1.toast / Development Kits / Mac OS / Open Transport 1.3 / Open Transport SDK / Open Tpt Client Developer / Samples / Internet / OTUdpPitchByNameSample.cp < prev    next >
Encoding:
Text File  |  1998-04-30  |  7.2 KB  |  347 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        OTUdpPitchByNameSample.cp
  3.  
  4.     Contains:    UDP pitch sample code
  5.  
  6.     Copyright:    © 1993-1997 by Apple Computer, Inc., all rights reserved.
  7.  
  8. */
  9.  
  10.  
  11. // OT UDP Pitch Test Program (as an SIOW app)
  12.  
  13. #include <QuickDraw.h>
  14. #include <stdio.h>
  15. #include <StdLib.h>
  16. #include <TextUtils.h>
  17. #include <strings.h>
  18. #include <String.h>
  19. #include <Events.h>
  20. #include <Menus.h>
  21. #include <Devices.h>
  22. #include <OpenTransport.h>
  23. #include <OpenTptInternet.h>
  24.  
  25.  
  26. /*******************************************************************************
  27. ** GLOBAL VARIABLES
  28. ********************************************************************************/
  29.  
  30. #define kMaxDataLen 256
  31.  
  32. const size_t    kMyPoolSize = 60000;
  33.  
  34. InetPort    gPitchPort=0;
  35.  
  36. unsigned long    gNoOfTimes=0;
  37. unsigned short gBindCompleted = 0;
  38.  
  39. OTEventCode    gCode;
  40. TEndpoint*    gCookie;
  41. OSErr        gErr;
  42.  
  43. char theAddr[255];
  44. DNSAddress* hisAddr = (DNSAddress*)theAddr;
  45.  
  46. struct InetAddress reqsin, retsin;
  47. char data[kMaxDataLen];
  48. char defaultData[] = "Go Cal, beat Stanford !!!";
  49.  
  50.  
  51. /*******************************************************************************
  52. ** Function Prototypes
  53. ********************************************************************************/
  54.  
  55. void Inits();
  56. void CleanUp();
  57. void Idle();    
  58. void DoIt();
  59. OSErr DoStaticBind(TEndpoint* ep);
  60. OSErr DoSend(TEndpoint* ep);
  61.  
  62.  
  63. /*******************************************************************************
  64. **  main function
  65. ********************************************************************************/
  66.  
  67. void main(int, char**) 
  68. {
  69.     Inits();
  70.     DoIt();
  71.     CleanUp();
  72. }
  73.  
  74. /*******************************************************************************
  75. ** Initialize Quickdraw and ASLM
  76. ********************************************************************************/
  77.  
  78. void Inits()
  79. {
  80.     InitGraf(&qd.thePort);
  81.     if (InitOpenTransport() != kOTNoError)
  82.     {
  83.         fprintf(stderr, "OTUdpPitch: Could not initialize ASLM, exiting\n");
  84.         exit(1);
  85.     }
  86. }
  87.  
  88. /*******************************************************************************
  89. ** Clean up at the end
  90. ********************************************************************************/
  91.  
  92. void CleanUp()
  93. {
  94.     CloseOpenTransport();
  95. }
  96.  
  97. /*******************************************************************************
  98. ** Idle
  99. ********************************************************************************/
  100.  
  101. void Idle()
  102. {
  103.     SystemTask();
  104. }
  105.  
  106. /*******************************************************************************
  107. ** EventHandler
  108. ********************************************************************************/
  109.  
  110. pascal void EventHandler(void*, OTEventCode event, OTResult result,
  111.                                void* cookie)
  112. {
  113.     if (event == T_BINDCOMPLETE)
  114.     {
  115.         gBindCompleted = 1;
  116.     }
  117.     else if (event == T_OPENCOMPLETE)
  118.     {
  119.         gErr = (OSErr) result;
  120.         gCookie = (TEndpoint*) cookie;
  121.         gCode = event;
  122.     }
  123.     return;
  124. }
  125.  
  126. /*******************************************************************************
  127. ** DoIt
  128. ********************************************************************************/
  129.  
  130. void DoIt()
  131. {
  132.     TEndpoint* ep = NULL;
  133.     TEndpointInfo info;
  134.     OSErr err=0;
  135.     long myport=0;
  136.     InetHost    myaddr=0;
  137.     char mystr[255];
  138.  
  139.     myport = 0;
  140.     fprintf(stderr, "What UDP port should I use to send data ? (enter UDP port number)\n");
  141.     if (gets(mystr) != 0) 
  142.     {
  143.         stringtonum(mystr, &myport);
  144.         gPitchPort =(InetPort)  myport;
  145.     }
  146.     else
  147.     {
  148.         fprintf(stderr, "Couldn't get source port from window!\n");
  149.         return;
  150.     }
  151.     
  152.     OTInitInetAddress(&reqsin, gPitchPort, (InetHost) 0);
  153.     
  154.     fprintf(stderr, "Enter the target as name:port\n");
  155.     if (gets(hisAddr->fName) != 0) 
  156.     {
  157.         hisAddr->fAddressType = AF_DNS;
  158.     }
  159.     else
  160.     {
  161.         fprintf(stderr, "Couldn't get target address and port from window!\n");
  162.         return;
  163.     }
  164.     
  165.     fprintf(stderr, "What should I send ? (enter data string)\n");
  166.     if (gets(data) == 0) {
  167.         strcpy(data, defaultData);
  168.         fprintf(stderr, "sending default data: <%s>\n", data);
  169.     }
  170.     data[strlen(data)] = '\n';
  171.  
  172.     fprintf(stderr, "How many times should I send this data ?\n");
  173.     if (gets(mystr) != 0) {
  174.         stringtonum(mystr, &myport);
  175.         gNoOfTimes = (unsigned short) myport;
  176.     }
  177.     else
  178.     {
  179.         fprintf(stderr, "Couldn't get number to send from window!\n");
  180.         return;
  181.     }    
  182.     
  183.     fprintf(stderr, "The program will send <%d> packets to <%s>\n", gNoOfTimes, hisAddr->fName);
  184.  
  185.     do
  186.     {
  187.         //
  188.         // Now create a UDP
  189.         //
  190.         gCode = 0;
  191.         gCookie = NULL;
  192.         gErr = 0;
  193.         err = OTAsyncOpenEndpoint(OTCreateConfiguration(kUDPName), 0, &info, EventHandler, 0);
  194.         if ( err == kOTNoError )
  195.         {
  196.             while ( gCode == 0 )
  197.                 OTIdle();
  198.             err = gErr;
  199.         }
  200.         if ( err != kOTNoError )
  201.         {
  202.             ep = NULL;
  203.             fprintf(stderr,"ERROR: OpenEndpoint(\"UDP\") failed with %d\n", err);
  204.             break;
  205.         }
  206.         else
  207.         {
  208.             ep = gCookie;
  209.         }
  210. #ifdef O        
  211.         //
  212.         // Install notifier we're going to use for testing
  213.         //
  214.         err = ep->InstallNotifier(&EventHandler, 0);
  215.         if ( err != kOTNoError )
  216.         {
  217.             fprintf(stderr, "ERROR: InstallNotifier() failed with %d\n", err);
  218.             break;
  219.         }
  220. #endif
  221.         //
  222.         // Try to bind
  223.         // 
  224.         ep->SetAsynchronous();
  225.         err = DoStaticBind(ep);
  226.         if ( err != kOTNoError )
  227.             break;        
  228.  
  229.         ep->SetSynchronous();
  230.  
  231.         while (gNoOfTimes--)
  232.         {
  233.             err = DoSend(ep);
  234.             if ( err != kOTNoError )
  235.                 break;
  236.             Idle();
  237.         }
  238.         //
  239.         // Try to Unbind
  240.         // 
  241.         err = ep->Unbind();
  242.         if ( err != kOTNoError )
  243.         {
  244.             fprintf(stderr, "ERROR: Unbind() returned %d\n", err);
  245.             break;
  246.         }
  247.     } while (false);
  248.  
  249.     if (ep)
  250.     {
  251.         //
  252.         // Remove notifier
  253.         //
  254.         ep->RemoveNotifier();
  255.         //
  256.         // Get rid of endpoint.
  257.         //
  258.         err = ep->Close();
  259.         if ( err != kOTNoError )
  260.         {
  261.             fprintf(stderr, "ERROR: CloseEndpoint() failed with %d\n", err);
  262.         }
  263.     }
  264.     fprintf(stderr, "Bye\n");
  265. }
  266.  
  267. /*******************************************************************************
  268. ** DoStaticBind
  269. ********************************************************************************/
  270.  
  271. OSErr DoStaticBind(TEndpoint* ep)
  272. {
  273.     TBind req, ret;
  274.     OSErr err=0;
  275.  
  276.     // bind udp to current address and port
  277.     req.addr.len = sizeof(struct InetAddress);
  278.     req.addr.buf = (unsigned char *) &reqsin;
  279.     req.qlen = 1;                                        // don't care for udp
  280.     ret.addr.maxlen = sizeof(struct InetAddress);
  281.     ret.addr.buf = (unsigned char *) &retsin;
  282.  
  283.     err = ep->Bind(&req, &ret);
  284.     if ( err != kOTNoError )
  285.     {
  286.         fprintf(stderr, "Static Bind returns %d\n", err);
  287.         return err;
  288.     }
  289.     while (gBindCompleted == 0)
  290.     {
  291.     }
  292.     gBindCompleted = 0;
  293.     return ( err != kOTNoError );
  294. }
  295.  
  296. /*******************************************************************************
  297. ** DoSend
  298. ********************************************************************************/
  299.  
  300. OSErr DoSend(TEndpoint* ep)
  301. {
  302.     OSErr        err;
  303.     OTResult     res;
  304.     TUnitData    unitdata;
  305.  
  306.     // Send a UDP datagram
  307.  
  308.     unitdata.addr.len = sizeof(OTAddressType) + strlen(hisAddr->fName);
  309.     unitdata.addr.buf = (UInt8*)hisAddr;
  310.     unitdata.opt.len = 0;
  311.     unitdata.opt.buf = 0;
  312.     unitdata.udata.len = strlen(data);
  313.     unitdata.udata.buf = (unsigned char *) data;
  314.     
  315.     err = ep->SndUData( &unitdata);
  316.  
  317.     if ( err != kOTNoError )
  318.     {
  319.         if (err == kOTLookErr)
  320.         {
  321.             res = ep->Look();
  322.             switch (res)
  323.             {
  324.                 case T_LISTEN:
  325.                 case T_CONNECT:
  326.                 case T_DATA:
  327.                 case T_EXDATA:
  328.                 case T_DISCONNECT:
  329.                 case T_UDERR:
  330.                 case T_ORDREL:
  331.                 case T_GODATA:
  332.                 case T_GOEXDATA:
  333.                 default:
  334.                     fprintf(stderr, "t_look returns %d\n", res);
  335.                     break;
  336.             }
  337.         }
  338.         else
  339.             fprintf(stderr, "SndUData() returns %d\n", err);
  340.     }
  341.     else 
  342.     {
  343.         fprintf(stderr, "Sent <%s> to <%s>\n", data, hisAddr->fName);
  344.     }
  345.     return err;
  346. }
  347.